home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / libs / libelf-0.5 / libelf-0 / libelf-0.5.2 / private.h < prev    next >
Encoding:
C/C++ Source or Header  |  1995-10-19  |  8.8 KB  |  333 lines

  1. /*
  2. private.h - private definitions for libelf.
  3. Copyright (C) 1995 Michael Riepe <riepe@ifwsn4.ifw.uni-hannover.de>
  4.  
  5. This library is free software; you can redistribute it and/or
  6. modify it under the terms of the GNU Library General Public
  7. License as published by the Free Software Foundation; either
  8. version 2 of the License, or (at your option) any later version.
  9.  
  10. This library is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13. Library General Public License for more details.
  14.  
  15. You should have received a copy of the GNU Library General Public
  16. License along with this library; if not, write to the Free Software
  17. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  18. */
  19.  
  20. #ifndef _PRIVATE_H
  21. #define _PRIVATE_H
  22.  
  23. #if HAVE_CONFIG_H
  24. # include <config.h>
  25. #endif
  26.  
  27. #include <sys/types.h>
  28.  
  29. #if STDC_HEADERS
  30. # include <stdlib.h>
  31. # include <string.h>
  32. #else
  33. extern char *malloc();
  34. extern void free(), bcopy(), bzero();
  35. extern int strcmp(), strncmp(), memcmp();
  36. extern void *memcpy(), *memmove(), *memset();
  37. #endif
  38.  
  39. #if HAVE_UNISTD_H
  40. # include <unistd.h>
  41. #else
  42. extern int read(), write();
  43. extern off_t lseek();
  44. #endif
  45.  
  46. #if !HAVE_MEMCMP
  47. # define memcmp    strncmp
  48. #endif
  49. #if !HAVE_MEMCPY
  50. # define memcpy(d,s,n)    bcopy(s,d,n)
  51. #endif
  52. #if !HAVE_MEMMOVE
  53. # define memmove(d,s,n)    bcopy(s,d,n)
  54. #endif
  55.  
  56. /*
  57.  * if c is 0, replace slow memset() substitute with bzero().
  58.  */
  59. #if !HAVE_MEMSET
  60. # define memset(d,c,n)    ((char)(c)?(void)__memset(d,c,n):bzero(d,n))
  61. extern void *__memset();
  62. #endif
  63.  
  64. #if HAVE_STRUCT_NLIST_DECLARATION
  65. # define nlist __override_nlist_declaration
  66. #endif
  67.  
  68. #if NEED_LINK_H
  69. # include <link.h>
  70. #endif
  71.  
  72. #include <libelf.h>
  73.  
  74. #if HAVE_STRUCT_NLIST_DECLARATION
  75. # undef nlist
  76. #endif
  77.  
  78. typedef struct Scn_Data Scn_Data;
  79.  
  80. /*
  81.  * ELF descriptor
  82.  */
  83. struct Elf {
  84.     /* common */
  85.     size_t    e_size;            /* file/member size */
  86.     Elf_Kind    e_kind;            /* kind of file */
  87.     char*    e_data;            /* file/member data */
  88.     char*    e_rawdata;        /* file/member raw data */
  89.     size_t    e_idlen;        /* identifier size */
  90.     int        e_fd;            /* file descriptor */
  91.     unsigned    e_count;        /* activation count */
  92.     /* archive members (still common) */
  93.     Elf*    e_parent;        /* NULL if not an archive member */
  94.     size_t    e_next;            /* 0 if not an archive member */
  95.     size_t    e_base;            /* 0 if not an archive member */
  96.     Elf*    e_link;            /* next archive member or NULL */
  97.     Elf_Arhdr*    e_arhdr;        /* archive member header or NULL */
  98.     /* archives */
  99.     size_t    e_off;            /* current member offset (for elf_begin) */
  100.     Elf*    e_members;        /* linked list of active archive members */
  101.     char*    e_symtab;        /* archive symbol table */
  102.     size_t    e_symlen;        /* length of archive symbol table */
  103.     char*    e_strtab;        /* archive string table */
  104.     size_t    e_strlen;        /* length of archive string table */
  105.     /* ELF files */
  106.     unsigned    e_class;        /* ELF class */
  107.     unsigned    e_encoding;        /* ELF data encoding */
  108.     unsigned    e_version;        /* ELF version */
  109.     char*    e_ehdr;            /* ELF header */
  110.     char*    e_phdr;            /* ELF program header table */
  111.     char*    e_shdr;            /* ELF section header table */
  112.     size_t    e_phnum;        /* size of program header table */
  113.     Elf_Scn*    e_scn_1;        /* first section */
  114.     Elf_Scn*    e_scn_n;        /* last section */
  115.     unsigned    e_elf_flags;        /* elf flags (ELF_F_*) */
  116.     unsigned    e_ehdr_flags;        /* ehdr flags (ELF_F_*) */
  117.     unsigned    e_phdr_flags;        /* phdr flags (ELF_F_*) */
  118.     /* misc flags */
  119.     unsigned    e_readable : 1;        /* file is readable */
  120.     unsigned    e_writable : 1;        /* file is writable */
  121.     unsigned    e_disabled : 1;        /* e_fd has been disabled */
  122.     unsigned    e_cooked : 1;        /* e_data was modified */
  123.     unsigned    e_free_syms : 1;    /* e_symtab is malloc'ed */
  124.     unsigned    e_free_ehdr : 1;    /* e_ehdr is malloc'ed */
  125.     unsigned    e_free_phdr : 1;    /* e_phdr is malloc'ed */
  126.     unsigned    e_free_shdr : 1;    /* e_shdr is malloc'ed */
  127.     /* magic number for debugging */
  128.     long    e_magic;
  129. };
  130.  
  131. #define ELF_MAGIC    0x012b649e
  132.  
  133. #define INIT_ELF    {\
  134.     /* e_size */    0,\
  135.     /* e_kind */    ELF_K_NONE,\
  136.     /* e_data */    NULL,\
  137.     /* e_rawdata */    NULL,\
  138.     /* e_idlen */    0,\
  139.     /* e_fd */        -1,\
  140.     /* e_count */    1,\
  141.     /* e_parent */    NULL,\
  142.     /* e_next */    0,\
  143.     /* e_base */    0,\
  144.     /* e_link */    NULL,\
  145.     /* e_arhdr */    NULL,\
  146.     /* e_off */        0,\
  147.     /* e_members */    NULL,\
  148.     /* e_symtab */    NULL,\
  149.     /* e_symlen */    0,\
  150.     /* e_strtab */    NULL,\
  151.     /* e_strlen */    0,\
  152.     /* e_class */    ELFCLASSNONE,\
  153.     /* e_encoding */    ELFDATANONE,\
  154.     /* e_version */    EV_NONE,\
  155.     /* e_ehdr */    NULL,\
  156.     /* e_phdr */    NULL,\
  157.     /* e_shdr */    NULL,\
  158.     /* e_phnum */    0,\
  159.     /* e_scn_1 */    NULL,\
  160.     /* e_scn_n */    NULL,\
  161.     /* e_elf_flags */    0,\
  162.     /* e_ehdr_flags */    0,\
  163.     /* e_phdr_flags */    0,\
  164.     /* e_readable */    0,\
  165.     /* e_writable */    0,\
  166.     /* e_disabled */    0,\
  167.     /* e_cooked */    0,\
  168.     /* e_free_syms */    0,\
  169.     /* e_free_ehdr */    0,\
  170.     /* e_free_phdr */    0,\
  171.     /* e_free_shdr */    0,\
  172.     /* e_magic */    ELF_MAGIC\
  173. }
  174.  
  175. /*
  176.  * Section descriptor
  177.  */
  178. struct Elf_Scn {
  179.     Elf_Scn*    s_link;            /* pointer to next Elf_Scn */
  180.     Elf*    s_elf;            /* pointer to elf descriptor */
  181.     char*    s_shdr;            /* pointer to section header */
  182.     size_t    s_index;        /* number of this section */
  183.     unsigned    s_scn_flags;        /* section flags (ELF_F_*) */
  184.     unsigned    s_shdr_flags;        /* shdr flags (ELF_F_*) */
  185.     Scn_Data*    s_data_1;        /* first data buffer */
  186.     Scn_Data*    s_data_n;        /* last data buffer */
  187.     Scn_Data*    s_rawdata;        /* raw data buffer */
  188.     /* data copied from shdr */
  189.     unsigned    s_type;            /* section type */
  190.     size_t    s_offset;        /* section offset */
  191.     size_t    s_size;            /* section size */
  192.     /* misc flags */
  193.     unsigned    s_freeme : 1;        /* this Elf_Scn was malloc'ed */
  194.     /* magic number for debugging */
  195.     long    s_magic;
  196. };
  197.  
  198. #define SCN_MAGIC    0x012c747d
  199.  
  200. #define INIT_SCN    {\
  201.     /* s_link */    NULL,\
  202.     /* s_elf */        NULL,\
  203.     /* s_shdr */    NULL,\
  204.     /* s_index */    0,\
  205.     /* s_scn_flags */    0,\
  206.     /* s_shdr_flags */    0,\
  207.     /* s_data_1 */    NULL,\
  208.     /* s_data_n */    NULL,\
  209.     /* s_rawdata */    NULL,\
  210.     /* s_type */    SHT_NULL,\
  211.     /* s_offset */    0,\
  212.     /* s_size */    0,\
  213.     /* s_freeme */    0,\
  214.     /* s_magic */    SCN_MAGIC\
  215. }
  216.  
  217. /*
  218.  * Data descriptor
  219.  */
  220. struct Scn_Data {
  221.     Elf_Data    sd_data;        /* must be first! */
  222.     Scn_Data*    sd_link;        /* pointer to next Scn_Data */
  223.     Elf_Scn*    sd_scn;            /* pointer to section */
  224.     char*    sd_memdata;        /* memory image of section */
  225.     unsigned    sd_data_flags;        /* data flags (ELF_F_*) */
  226.     /* misc flags */
  227.     unsigned    sd_freeme : 1;        /* this Scn_Data was malloc'ed */
  228.     unsigned    sd_free_data : 1;    /* sd_memdata is malloc'ed */
  229.     /* magic number for debugging */
  230.     long    sd_magic;
  231. };
  232.  
  233. #define DATA_MAGIC    0x01072639
  234.  
  235. #define INIT_DATA    {\
  236.     {\
  237.     /* d_buf */        NULL,\
  238.     /* d_type */    ELF_T_BYTE,\
  239.     /* d_size */    0,\
  240.     /* d_off */        0,\
  241.     /* d_align */    0,\
  242.     /* d_version */    EV_NONE\
  243.     },\
  244.     /* sd_link */    NULL,\
  245.     /* sd_scn */    NULL,\
  246.     /* sd_memdata */    NULL,\
  247.     /* sd_data_flags */    0,\
  248.     /* sd_freeme */    0,\
  249.     /* sd_free_data */    0,\
  250.     /* sd_magic */    DATA_MAGIC\
  251. }
  252.  
  253. /*
  254.  * Private status variables
  255.  */
  256. extern unsigned _elf_version;
  257. extern int _elf_errno;
  258. extern int _elf_fill;
  259.  
  260. /*
  261.  * Private functions
  262.  */
  263. extern void *_elf_read __P((Elf*, void*, size_t, size_t));
  264. extern int _elf_cook __P((Elf*));
  265.  
  266. /*
  267.  * Private data
  268.  */
  269. extern const Elf_Scn _elf_scn_init;
  270. extern const Scn_Data _elf_data_init;
  271. extern const Elf_Type _elf_scn_types[SHT_NUM];
  272. extern const size_t _elf32_fmsize[EV_CURRENT - EV_NONE][ELF_T_NUM][2];
  273.  
  274. /*
  275.  * Access macros for _elf32_fmsize
  276.  */
  277. #define _fmsize32(v,t,w)    (_elf32_fmsize[(v)-EV_NONE-1][(t)-ELF_T_BYTE][(w)])
  278. #define _fsize32(v,t)        _fmsize32((v),(t),1)
  279. #define _msize32(v,t)        _fmsize32((v),(t),0)
  280.  
  281. /*
  282.  * Various checks
  283.  */
  284. #define valid_class(c)        ((c) >= ELFCLASS32 && (c) <= ELFCLASS64)
  285. #define valid_encoding(e)    ((e) >= ELFDATA2LSB && (e) <= ELFDATA2MSB)
  286. #define valid_version(v)    ((v) > EV_NONE && (v) <= EV_CURRENT)
  287. #define valid_type(t)        ((t) >= ELF_T_BYTE && (t) < ELF_T_NUM)
  288. #define valid_scntype(s)    ((s) >= SHT_NULL && (s) < SHT_NUM)
  289.  
  290. /*
  291.  * Error codes
  292.  */
  293. enum {
  294. #define __err__(a,b)    a,
  295. #include <errors.h>        /* include constants from errors.h */
  296. #undef __err__
  297. ERROR_NUM
  298. };
  299.  
  300. #define seterr(err)    (_elf_errno = (err))
  301.  
  302. /*
  303.  * Sizes of data types (external representation)
  304.  */
  305. #ifndef ELF32_FSZ_ADDR
  306. /*
  307.  * These definitions should be in <elf.h>, but...
  308.  */
  309. # define ELF32_FSZ_ADDR        4
  310. # define ELF32_FSZ_HALF        2
  311. # define ELF32_FSZ_OFF        4
  312. # define ELF32_FSZ_SWORD    4
  313. # define ELF32_FSZ_WORD        4
  314. #endif
  315.  
  316. /*
  317.  * Debugging
  318.  */
  319. #if 1
  320. # include <stdio.h>
  321. # if __STDC__
  322. #  define elf_assert(x)    ((void)((x)||__elf_assert(__FILE__,__LINE__,#x)))
  323. # else
  324. #  define elf_assert(x)    ((void)((x)||__elf_assert(__FILE__,__LINE__,"x")))
  325. # endif
  326. # define __elf_assert(f,l,x)    (fprintf(stderr,\
  327.     "%s:%u: elf assertion failure: %s\n",(f),(l),(x)),abort(),0)
  328. #else
  329. # define elf_assert(x)    (0)
  330. #endif
  331.  
  332. #endif /* _PRIVATE_H */
  333.